# -*- coding: utf-8 -*-
__author__ = 'lztkdr'
__date__ = '2020/12/3 9:55'

"""
    gevent是底层封装了greenlet的协程第三方模块，安装前必须安装greenlet，是其的增强版
    1- gevent自动切换的自动挡 2- greenlet需要手动切换的手动挡
    2- 使用gevent不会自动切换协程
    3- 导入gevent的monkey去破解使协程自动切换
    4- patch就是破解的意思，recv, recvfrom, sleep等函数(默认阻塞)变成不再阻塞
    5- joinall不能少，让其阻塞等待，不然main就执行完毕，就退出了
"""
import time
import gevent
from gevent import monkey

monkey.patch_all()


def work(num):
	for i in range(num):
		print(i, "in work %s" % gevent.getcurrent())
		# 阻塞之后，协程会自动切换
		time.sleep(0.3)


def testGevent():
	# 创建一个协程对象，创建的时候就自动运行了，不需要手动启动
	g1 = gevent.spawn(work, 10)
	g2 = gevent.spawn(work, 10)
	g3 = gevent.spawn(work, 10)

	# 阻塞等待协程执行完毕
	# 没使用monkey.patch_all()破解的时候不会自动切换，破解后就会随机协程
	# g1.join()
	# g2.join()
	# g3.join()

	# 程序从上到下执行，不管之前有没有异步代码，遇到join相当于一面墙，堵住下面的路
	gevent.joinall([g1, g2, g3])

	print("全部协程结束完毕.")


if __name__ == '__main__':
	testGevent()
